seo: add SoftwareApplication schema on homepage, enterprise, pricing, features#4821
Conversation
… features Adds a reusable SchemaSoftwareApplication.astro component and injects it on the four highest-traffic product pages. Gives AI agents and search crawlers a machine-parseable description of Kestra as a software product, including category, license, supported platforms, and offers per tier. Identified as priority 1 in the Agents Taskforce Pillar 1 audit.
## 🔦 Lighthouse Benchmark
Scores (0–100, higher is better)
Core Web Vitals (lower is better)
Legend🟢 improved · 🔻 regressed · (blank) no significant change ☁️ Cloudflare Worker Preview Deployed!🔗 https://ks-schema-software-application-docs.kestra-io.workers.dev |
| "applicationCategory": "DeveloperApplication", | ||
| "applicationSubCategory": "Workflow Orchestration", | ||
| "operatingSystem": "Linux, macOS, Windows, Docker, Kubernetes", | ||
| "softwareVersion": "1.0", |
There was a problem hiding this comment.
What is this version ?
There was a problem hiding this comment.
Bien vu, c'était une valeur statique inventée. Retirée dans 1b4e115 — softwareVersion est optionnel sur SoftwareApplication et mieux vaut l'omettre que de servir une fausse info qui se désynchronise à chaque release.
| @@ -1,5 +1,6 @@ | |||
| --- | |||
| import Layout from "~/components/layout.astro" | |||
| import SchemaSoftwareApplication from "~/components/common/SchemaSoftwareApplication.astro" | |||
|
|
|||
| import Hero from "~/components/enterprise/Hero.vue" | |||
| import SeeHow from "~/components/common/SeeHow.astro" | |||
There was a problem hiding this comment.
You might know better. is it good for Crawlers ?
Identical @id, 4 different url values, 2 different name s. To a JSON-LD parser this would be one entity with four contradictory definitions. no ?
| page | id | name | url |
|---|---|---|---|
| home | https://kestra.io/#software | Kestra | https://kestra.io |
| enterprise | https://kestra.io/#software | Kestra Enterprise Edition | https://kestra.io/enterprise |
| features | https://kestra.io/#software | Kestra | https://kestra.io/features |
| pricing | https://kestra.io/#software | Kestra | https://kestra.io/pricing |
There was a problem hiding this comment.
Très juste, c'était une vraie collision JSON-LD. Fix dans 1b4e115 :
SchemaSoftwareApplicationaccepte maintenant un propid(par défaut#software) etisVariantOf./enterprisedéclare désormais une entité distincte@id=https://kestra.io/#enterprise-editionavecisVariantOf: { @id: https://kestra.io/#software }→ un parser voit deux entités liées (produit principal + variante Enterprise), plus de conflit.- Composant retiré de
/pricing(lepricingSchemaProduct+Offer existant couvre déjà la page) et/features(rien d'unique à déclarer).
Résultat :
| page | @id | name |
|---|---|---|
/ |
#software |
Kestra |
/enterprise |
#enterprise-edition (isVariantOf → #software) |
Kestra Enterprise Edition |
/pricing |
— (Product/Offer schema déjà en place) | — |
/features |
— | — |
There was a problem hiding this comment.
I am still dumb in FR language 😜. I can understand English well 🙂
There was a problem hiding this comment.
Oups sorry, it was Claude in French !
…review) - Make SchemaSoftwareApplication @id parameterizable via prop (default remains #software for the home page). - Enterprise page now declares a distinct entity @id=#enterprise-edition with isVariantOf -> #software, so JSON-LD parsers no longer see four contradictory definitions sharing the same @id. - Remove the component from /pricing (already covered by the page-level Product+Offer pricingSchema) and /features (no unique entity to declare). - Drop the hardcoded "softwareVersion": "1.0" — stale value that drifts from the real Kestra release. Field is optional and best omitted. - Tighten operatingSystem to actual OSes (Linux, macOS, Windows). Docker and Kubernetes are deployment targets, not operating systems. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…twareApplication; add to /features The previous decision to leave the existing Product+Offer block on /pricing was based on the assumption it already covered the page. Google Rich Results Test shows otherwise: the Product schema triggers Merchant Listing validation rules (image, priceValidUntil, hasMerchantReturnPolicy, shippingDetails), producing 6 errors — none of which apply to a SaaS pricing page. - /pricing: drop the inline pricingSchema (3x Product) and emit the canonical #software entity via SchemaSoftwareApplication. The component's built-in offers array already declares all three tiers (Open Source, Cloud, Enterprise), so no information is lost and Google validates cleanly under SoftwareApplication rules. - /features: add SchemaSoftwareApplication so the page is no longer schema-silent (was only emitting BreadcrumbList + Organization). - Component: bump default description from "1200+ plugins" to "1400+ plugins" to match the live homepage copy. Completes the original PR scope (homepage + enterprise + pricing + features) and eliminates the Merchant Listing validation errors. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
Two-step fix recap for @Piyush-r-bhaskar 1.
2. Product schema on The original justification for removing the component from
These rules apply because Google treats Fix:
Final state
Test plan once merged: re-run Rich Results Test on the four URLs to confirm 0 errors and |
…cation # Conflicts: # src/pages/pricing/index.astro
|
Addressed in 1b4e115 |
Summary
Adds a reusable
SchemaSoftwareApplication.astrocomponent and injects it on the four highest-traffic product pages: homepage, enterprise, pricing, and features.Identified as priority 1 in the Agents Taskforce Pillar 1 audit — current site only emits
Organization+WebSite(homepage) /BreadcrumbListschema. WithoutSoftwareApplication, AI agents and crawlers have to infer that Kestra is a software product instead of reading it directly.What the schema declares
@type: SoftwareApplication(+@id: https://kestra.io/#software)applicationCategory: DeveloperApplication,applicationSubCategory: Workflow OrchestrationoperatingSystem,license(Apache 2.0),downloadUrl(GitHub repo)author/publisherreferences the existingOrganization@idfromlayout.astro(clean graph linkage)offers: three tiers — Open Source (free), Cloud (pay-as-you-go), Enterprise (contact sales)name/description/urloverrides to match page positioningFiles
src/components/common/SchemaSoftwareApplication.astro— new reusable componentsrc/pages/index.astro,src/pages/enterprise/index.astro,src/pages/pricing/index.astro,src/pages/features/index.astro— inject via existing<Fragment slot="head">pattern (same aspricingSchema)Test plan
SoftwareApplicationmarkupSoftwareApplicationis detected on all 4 pages